/*
 * Niiuzu
 * Copyright (C) 2011  Thierry Nowak
 * 
 * This program is free software: you can redistribute it and/or modify it under
 * the terms of the GNU General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later
 * version.
 * 
 * This program is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 * FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
 * details.
 * 
 * You should have received a copy of the GNU General Public License along with
 * this program.  If not, see <http://www.gnu.org/licenses/>.
 */
package com.niiuzu.client.eventbus;

import com.google.gwt.user.client.ui.IsWidget;
import com.mvp4g.client.annotation.Event;
import com.mvp4g.client.annotation.Events;
import com.mvp4g.client.event.EventBus;
import com.niiuzu.client.module.FeedModule;
import com.niiuzu.client.screen.channel.manager.ChannelManagerPresenter;
import com.niiuzu.client.screen.feed.manager.FeedManagerPresenter;
import com.niiuzu.client.screen.feed.viewer.FeedViewerPresenter;
import com.niiuzu.client.screen.feed.viewer.FeedViewerViewImpl;
import com.niiuzu.shared.model.RssChannel;
import com.niiuzu.shared.model.RssEntry;

/**
 * EventBus regroupant tous les événements qui concerne la recherche et
 * l'affichage des entrées des flux RSS.
 */
@Events(startView = FeedViewerViewImpl.class, module = FeedModule.class)
public interface FeedEventBus extends EventBus, CommonEventBus {

	/**
	 * L'application vient de démarrer, l'affichage de la gestion des flux et
	 * des données RSS est demandée.
	 * 
	 * @see FeedManagerPresenter#onApplicationStarted()
	 */
	@Event(handlers = FeedManagerPresenter.class)
	void applicationStarted();

	/**
	 * Le chargement de la vue de la gestion des données et des flux RSS vient
	 * de débuter.
	 * 
	 * @see ChannelManagerPresenter#onChannelManagerLoadStarted()
	 */
	@Event(handlers = ChannelManagerPresenter.class)
	void channelManagerLoadStarted();

	/**
	 * Le chargement de la vue de la gestion des données et des flux RSS est
	 * terminée.
	 * 
	 * @see FeedManagerPresenter#onChannelManagerLoaded(IsWidget)
	 */
	@Event(handlers = FeedManagerPresenter.class)
	void channelManagerLoaded(IsWidget widget);

	/**
	 * Le chargement de la vue dédiée à la consultation des données provenant
	 * des flux RSS vient de débuter.
	 * 
	 * @see FeedViewerPresenter#onFeedViewerLoadStarted()
	 */
	@Event(handlers = FeedViewerPresenter.class)
	void feedViewerLoadStarted();

	/**
	 * Le chargement de la vue dédiée à la consultation des données provenant
	 * des flux RSS est terminée.
	 * 
	 * @see FeedManagerPresenter#onFeedViewerLoaded(IsWidget)
	 */
	@Event(handlers = FeedManagerPresenter.class)
	void feedViewerLoaded(IsWidget widget);

	/**
	 * La vue du gestionnaire des flux RSS est chargée.
	 * 
	 * @see ApplicationEventBus#feedManagerViewLoaded(IsWidget)
	 */
	@Event(forwardToParent = true)
	void feedManagerViewLoaded(IsWidget widget);

	/**
	 * Une erreur a été déclenchée au sein de l'application.
	 * 
	 * @see ApplicationEventBus#errorThrown(Throwable)
	 */
	@Event(forwardToParent = true)
	void errorThrown(Throwable caught);

	/**
	 * De nouvelles données provenant d'un flux vient d'être reçues.
	 * 
	 * @see FeedViewerPresenter#onFeedEntriesReceived(RssEntry[])
	 */
	@Event(handlers = FeedViewerPresenter.class)
	void feedEntriesReceived(RssEntry[] feedEntries);

	/**
	 * Un nouveau flux ({@link RssChannel}) a été ajouté pour la session en
	 * cours.
	 * 
	 * @see FeedManagerPresenter#onChannelListUpdated()
	 */
	@Event(handlers = FeedManagerPresenter.class)
	void channelListUpdated();

}
